<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

/* // Promise是一种异步编程解决方案
// 使用Promise解决异步编程问题，可以避免回调地狱，可以将异步编译按照同步的流程表达出来

// Promise对象的三种状态：
// pending 进行中
// fulfilled 成功
// rejected 失败

// Promise对象状态改变：
// 1.从进行中改变为成功
// 2.从进行中改变为失败

// 创建Promise对象
let p1 = new Promise((resolve,reject)=>{// excutor执行器函数，同步执行
    // resolve是一个函数，将Promise对象改变为成功状态
    // reject是一个函数，将Promise对象改变为失败状态
    resolve(123);// 改变状态1
    // reject(456);// 改变状态2
    // abc();// 改变状态3
    // throw 666;// 改变状态4
});
// then方法，用于指定Promise对象成功或失败状态的回调函数，返回一个新的Promise对象
p1.then(// then方法同步执行
    (res)=>{// 回调函数异步执行
        console.log( 'p1成功',res );
        // 1.返回一个非Promise对象值时，p2为成功状态，结果为返回的值
        // return 666;
        // 2.返回一个Promise对象值时，p2的状态和结果跟随返回Promise对象的状态和结果
        // return Promise.resolve(777);
        // return Promise.reject(888);
        // 3.程序报错时，p2为失败状态，结果为报错信息
        // hehe();
        // 4.抛出一个值时，p2为失败状态，结果为抛出的值
        // throw 999;

        // 返回一个进行中状态的Promise对象终止链式调用
        return new Promise(()=>{});
    },
    (res)=>{// 回调函数异步执行
        console.log( 'p1失败',res );
        // 1.返回一个非Promise对象值时，p2为成功状态，结果为返回的值
        // return 666;
        // 2.返回一个Promise对象值时，p2的状态和结果跟随返回Promise对象的状态和结果
        // return Promise.resolve(777);
        // return Promise.reject(888);
        // 3.程序报错时，p2为失败状态，结果为报错信息
        // hehe();
        // 4.抛出一个值时，p2为失败状态，结果为抛出的值
        // throw 999;

        // 返回一个进行中状态的Promise对象终止链式调用
        return new Promise(()=>{});
    }
)// p2的状态和结果取决于 p1回调函数的返回值
.then(
    (res)=>{// 回调函数异步执行
        console.log( 'p2成功',res );
    },
    (res)=>{// 回调函数异步执行
        console.log( 'p2失败',res );
    }
)
// catch方法，用于捕获错误或指定Promise对象失败的回调函数，返回一个新的Promise对象
.catch((err)=>{
    console.log( '失败状态或有错误',err );
})
// finally方法，无论Promise是成功还是失败最后都会执行的方法
.finally(()=>{
    console.log( '最后执行的方法' );
});

// Promise.all([p1,p2,p3])返回一个新的Promise对象p4
// 当p1 p2 p3都成功时，p4为成功状态，结果为[p1 p2 p3的结果]
// 当p1 p2 p3任意一个失败时，p4为失败状态，结果跟随第一个失败的结果

// Promise.race([p1,p2,p3])返回一个新的Promise对象p4
// p4跟随p1 p2 p3任意一个最先完成的Promise对象的状态和结果

// Promise.resolve()返回一个成功状态的Promise对象
// Promise.reject()返回一个失败状态的Promise对象 */


</script>
</body>
</html>